# 导入必要的库和模块
import pickle
import gradio as gr
import numpy as np
from PIL import Image

# 加载保存的KNN模型，这样我们可以使用预训练的模型进行预测
with open('best_knn_model.pkl', 'rb') as f:
    knn_model = pickle.load(f)

# 定义预测函数，这个函数将用于Gradio接口进行预测
def predict_digit(image):
    # 将输入的图像转换为适合模型预测的格式
    # 调整图像大小为8x8，与训练数据格式一致
    image = image.resize((8, 8))
    # 转换为灰度图
    image = image.convert('L')
    # 转换为numpy数组
    image_array = np.array(image)
    # 将图像像素值缩放到0-16范围（与digits数据集一致）
    image_array = (image_array / 255) * 16
    # 展平为一维数组
    image_array = image_array.flatten()
    # 使用模型进行预测
    prediction = knn_model.predict([image_array])
    return int(prediction[0])

# 创建Gradio接口，这个接口将用于用户输入和显示预测结果
iface = gr.Interface(
    fn=predict_digit,
    inputs=gr.Image(label="请手绘一个数字"),
    outputs=gr.Label(label="预测的数字"),
    title="手写数字识别"
)

# 启动Gradio接口，用户可以通过这个接口进行交互
iface.launch()